package cn.wn.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 统一返回结果
 * @param <T> 返回的对象类型，泛型，使用这个对象时候传入具体的类型
 *
 * 返回的对象属性如果为空，就不转换为json格式数据：
 * 1、@JsonInclude(JsonInclude.Include.NON_NULL)
 * 2、或者在yml中进行全局配置：
 *    jackson.default-property-inclusion: non_null
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
//@JsonInclude(JsonInclude.Include.NON_NULL)
public class ResultInfo<T> {
    // 操作结果
    private boolean success;
    // 返回的提示信息
    private String message;
    // 返回的数据
    private T data;

    /**
     * 抽取方法，统一返回ResultInfo对象
     * @param success 操作结果
     * @param message 返回的提示信息
     * @param data    返回的数据
     * @param <T>     返回的对象
     * @return 统一返回ResultInfo给前端
     */
    private static <T> ResultInfo<T> common(boolean success,String message,T data){
        return new ResultInfo<>(success, message, data);
    }


    /**
     * 返回操作成功
     * @param <T>
     * @return
     */
    public static <T> ResultInfo<T> ok(){
        return common(true,null,null);
    }

    /**
     * 返回操作成功, 同时返回提示信息
     * @param message
     * @param <T>
     * @return
     */
    public static <T> ResultInfo<T> ok(String message){
        return common(true,message,null);
    }

    /**
     * 返回操作成功,返回数据
     * @param data
     * @param <T>
     * @return
     */
    public static <T> ResultInfo<T> ok(T data){
        return common(true,null,data);
    }

    public static <T> ResultInfo<T> fail(){
        return common(false,null,null);
    }
    public static <T> ResultInfo<T> fail(String message){
        return common(false,message,null);
    }
    public static <T> ResultInfo<T> fail(T data){
        return common(false,null,data);
    }
    public static <T> ResultInfo<T> fail(T data,String message){
        return common(false,message,data);
    }
}
